﻿//#include <iostream>
//#include <vector>
//#include <map>
//#include <optional>
//
//// 结合文档，optional的基本使用
//void test_example1(){
//	// 1、定义optional 对象 
//	std::optional<int> maybeInt; // 初始为空 
//	std::optional<std::string> maybeString = "Hello"; // 初始有值 
//	std::optional<double> empty = std::nullopt; // 显式设置为空 
//	std::optional<double> opt = std::make_optional(3.14); // 使用 std::make_optional 创建对象
//
//	// 2、检查是否有值 
//	if (maybeInt.has_value()) {
//		std::cout << "has_value1: " << *maybeInt << std::endl;
//	}
//	// 或者更简洁的写法 
//	if (maybeString) {
//		std::cout << "has_value2: " << *maybeString << std::endl;
//	}
//
//	// 3、尝试访问无值的 optional
//	try {
//		int value = maybeInt.value();
//	}catch (const std::bad_optional_access& e) {
//		std::cout << e.what() << std::endl; // 无值时抛出 std::bad_optional_access 
//	}
//	
//	// 安全取值
//	maybeInt = 1;
//	std::cout << "maybeInt has value: " << maybeInt.value_or(-1) << std::endl;
//
//	// 不安全但快速的访问 - 无值时行为未定义 
//	int value1 = *maybeInt;
//
//	// 带默认值的访问 
//	int value2 = maybeInt.value_or(2); // ⽆值时返回2 
//	std::cout << "value2: " << value2 << std::endl;
//
//	// 4、修改值 
//	maybeInt = 42; // 赋新值 
//	maybeInt = std::nullopt; // 设为空 
//	maybeInt.reset(); // 设为空 
//}
//
//// optional实践中的使用场景 
//void test_example2(){
//	// 查找⼀个顶点对应的下标编号 
//	std::map<std::string, int> indexMap = { {"张庄",1}, {"王村",2}, {"李家村",3}, {"王家坪",3} };
//	auto findIndex = [&indexMap](const std::string& str)->std::optional<int>
//	{
//		auto it = indexMap.find(str);
//		if (it != indexMap.end()){
//			return it->second;
//		}else{
//			return std::nullopt;
//		}
//	};
//	std::string x;
//	std::cin >> x;
//	std::optional<int> index = findIndex(x);
//	if (index){
//		std::cout << x << "对应的编号为:" << *index << std::endl;
//	}else{
//		std::cout << x << "是非法顶点" << std::endl;
//	}
//	std::vector<std::string> v = { "张庄", "李庄", "" };
//	auto access = [&v](int i)-> std::optional<std::string>
//	{
//		if (i < v.size()){
//			return v[i];
//		}else{
//			// 以前的语法这里函数只能⽤抛异常或者断⾔⽅式处理i越界的情况 
//			// i越界不能返回""，因为正常数据可能就是"",⽆法区分 
//			std::nullopt;
//		}
//	};
//}
//	
//int main(){
//	test_example1();
//	test_example2();
//	return 0;
//}
//
//
